<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>闭包</title>
</head>
<body>

</body>
<script>

    /*1. 立即执行函数 */

   /* (function (message) {
         alert(message)
     })("world");*/


    /***
     * 2.闭包
     *     1. 函数内部嵌套函数
     *     2. 函数内部引用外部的参数或者变量
     *     3. 参数或者变量不会把垃圾回收机制回收
     * */


 /*   function foo() {
       var name ="Martin";
        return function () {
            alert("hello " + this.name);
        }
    }

    var boo = foo();// var boo = function(){}
    foo=null;
    boo();*/


/* function foo() {
     var num =0;

     return function () {
         var m=0;
         console.log("outter: " + (++num));
         console.log("inner:"+(++m));
     }
 }


var boo = foo(); //
 boo(); // 1 1
 boo(); // 1 1
 boo(); // 1 1*/


var funs = [];

/*for(var i=0;i<10;i++){
    funs[i] = function () {
        alert(i); // 只要被引用，就不会被销毁；只能得到最后一次引用的结果
    }
}

funs[4]();
funs[0]();*/


    /*
     * 3. 闭包 和 立刻执行函数
    * */
    for(var i=0;i<10;i++){
        funs[i] =(
            function (index) {
                return function () {
                    alert(index)
                }
            }
        )(i)
    }

   // funs[7]();


    /*  4. 高阶函数
     *      参数或者返回是函数的函数
     *      闭包
    * */

    var arr = [12,3,5,90];

  /***
   *  map-reduce (big data)
   * */
  var arr2  = arr.map((item)=>item*2); // 回调函数
  var arr3 =  arr.reduce((pre,result)=>result+=pre,0);
  var arr4 = arr.filter((item)=>item>10); // 按条件过滤，返回一个新的数组        ----- 返回数组
  var arr5 = arr.find((item)=>item>10);  // 按条件过滤，返回第一个满足条件的元素 ---返回对象





    function filter2(arr,callback) {
      var innerArr=[];

        for (var i=0;i<arr.length;i++){
            if(callback(arr[i])){
                innerArr.push(arr[i])
            }
        }

        return innerArr;
    }

   var arr6=  filter2([1,23,34],(item)=>item>30);
    console.log(arr6);



</script>
</html>